package com.shujia.reflect;

import java.lang.reflect.Constructor;

public class Demo1Class {

    public static void main(String[] args) throws Exception {

        /*
         * 所在class文件被加载到内存中之后都是Class的一个对象 （类对象）
         * 每一个类再内存中有且只有一个唯一的内对象
         *
         */


        //student 是Student类的对象
        Student student = new Student("001");
        student.setId("001");

        /*
         *
         * 获取类对象的方法
         *
         */


        System.out.println("类加载之前");
        //1、动态获取类对象
        Class<?> aClass = Class.forName("com.shujia.reflect.Student");
        System.out.println("类加载之后");


        //2、通过类获取    静态加载
        Class<Student> studentClass = Student.class;

        //通过多种方式获取到的类对象是一样的
        System.out.println(aClass == studentClass);

        //3、通过类的对象获取类对象
        Class aClass1 = student.getClass();

        System.out.println(aClass1 == aClass);


        /**
         *
         * 类对象就是类文件再内存中的字节码文件
         *
         * 类对象的作用
         * 1、获取类的属性
         * 2、获取类的方法
         * 3、获取类的构造函数
         * 4、可以通过类对象创建类的对象
         * 5、获取注解
         */

        //通过new关键字创建对象实际上是调用了类的构造方法
        Student student1 = new Student("001");


        //通过类对象创建对象

        //1、获取类对象

        Class<Student> clazz = Student.class;

        //摩恩调用类的无参构造函数
        Student student2 = clazz.newInstance();

        //2、获取构造函数
        Constructor<Student> constructor = clazz.getConstructor(String.class);

        Student o = constructor.newInstance("001");

        System.out.println(o);


        //获取属性
        //获取公共的属性
        clazz.getFields();

        //获取所有属性
        clazz.getDeclaredFields();


        //获取方法
        //获取公共方法
        clazz.getMethods();

        //获取所有方法
        clazz.getDeclaredMethods();


        //获取注解
        clazz.getAnnotations();

    }
}
